package com.qdlc.p2p.dal.dao;

import com.qdlc.p2p.dal.common.model.jpa.PageDataList;
import com.qdlc.p2p.dal.dto.Account;
import com.qdlc.p2p.dal.model.AccountModel;

/**
 * 用户资金账户信息Dao
 *
 * @author Kaiju Zhao
 * @date 2016-03-04
 * @version 1.1.0.0
 */
public interface AccountDao {

	/**
	 * 新增用户资金账户信息
	 *
	 * @author Kaiju Zhao
	 * @param account
	 */
	void save(Account account);

	/**
	 * 更新用户资金账户信息
	 *
	 * @author Kaiju Zhao
	 * @param account
	 */
	int update(Account account);

	/**
	 * 更新总金额和可用金额
	 *
	 * @author Kaiju Zhao
	 * @param account
	 */
	void updateTotalAndUseMoney(Account account);

	/**
	 * 更新总金额和冻结金额
	 *
	 * @author Kaiju Zhao
	 * @param account
	 */
	void updateTotalAndNoUseMoney(Account account);

	/**
	 * 更新可用金额和冻结金额
	 *
	 * @author Kaiju Zhao
	 * @param account
	 */
	void updateUseMoneyAndNoUseMoney(Account account);

	/**
	 * 更新总金额和代收金额
	 *
	 * @author Kaiju Zhao
	 * @param account
	 */
	void updateTotalAndCollection(Account account);

	/**
	 * 更新可用金额和代收金额
	 *
	 * @author Kaiju Zhao
	 * @param account
	 */
	void updateUseMoneyAndCollection(Account account);

	/**
	 * 更新冻结金额和代收金额
	 *
	 * @author Kaiju Zhao
	 * @param account
	 */
	void updateNoUseMoneyAndCollection(Account account);

	/**
	 * 更新用户资金账户的新浪收益
	 *
	 * @author Kaiju Zhao
	 * @param accountId
	 * @param yesterdayBonus
	 * @param totalBonus
	 * @return
	 */
	int updateSinaProfit(long accountId, double yesterdayBonus, double totalBonus);

	/**
	 * 根据id查询用户资金账户信息
	 *
	 * @author Kaiju Zhao
	 * @param id
	 * @return
	 */
	Account findById(long id);

	/**
	 * 根据用户ID获取用户资金账户信息(加有悲观锁，防止并发问题)
	 *
	 * @author Kaiju Zhao
	 * @param userId
	 * @return
	 */
	Account findByUserId(long userId);

	/**
	 * 分页获取用户资金账户信息列表
	 *
	 * @author Kaiju Zhao
	 * @param model
	 * @return
	 */
	PageDataList<AccountModel> list(AccountModel model);

    /**
     * 获取用户可用金额
     *
	 * @author Kaiju Zhao
     * @param userId
     * @return
     */
    double findUseMoneyByUserId(long userId);

	/**
	 * 获取所有可用金额
	 *
	 * @author Kaiju Zhao
	 * @return
	 */
	double sumAllUseMoney();

	/**
	 * 获取所有可用金额 , 排除借款人的可用金额
	 *
	 * @author hongbinglin
	 * @return
	 */
	double sumUseMoney();

}
